package com.service;

import com.dto.OrderDto;
import com.dto.OrderItemDto;
import com.entity.Order;
import com.entity.OrderItem;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @InterfaceName OrderService
 * @Description 订单业务层接口
 * @Author Kx
 * @Date 2025/5/27 19:44
 * @Version 1.0
 */
public interface OrderService {
    /**
     * @author: kx
     * @date: 2025/5/27 19:46
     * @param order : 订单信息
     * @param orderItemList : 订单商品集合
     * @description: 添加订单信息(通过购物车购买)
    */
    void addOrderTrolley(Order order, List<OrderItem> orderItemList);

    /**
     * @author: kx
     * @date: 2025/6/3 9:46
     * @param order : 订单信息
     * @param orderItem : 订单商品信息
     * @description: 添加订单信息(直接购买商品)
    */
    void addOrder(Order order, List<OrderItem> orderItem) ;


    /**
     * @author: kx
     * @date: 2025/5/27 19:53
     * @param orderItem : 订单商品信息
     * @description: 添加订单商品信息
    */
    void addOrderItem(OrderItem orderItem);

    /**
     * @author: kx
     * @date: 2025/5/28 10:33
     * @param userId : 用户编号
     * @return java.util.List<com.entity.OrderItem>
     * @description: 根据用户编号查询该用户的购物车信息
    */
    List<OrderItemDto> findByUserId(Integer userId);

    /**
     * @author: kx
     * @date: 2025/5/28 10:52
     * @param orderItem : 订单商品信息
     * @description: 修改订单商品
    */
    void updateOrderItem(OrderItem orderItem);
    
    /** 
     * @author: kx
     * @date: 2025/5/28 11:09
     * @param itemId : 订单商品编号
     * @description: 删除订单商品
    */
    void deleteOrderItem(Integer itemId);

    /**
     * @author: kx
     * @date: 2025/5/28 15:04
     * @param orderStatus : 订单状态
     * @param userId : 用户编号
     * @return java.util.List<com.dto.OrderDto>
     * @description: 根据订单状态查询和用户编号订单信息
    */
    List<OrderDto> findByOrderStatus(Integer orderStatus, Integer userId);

    /**
     * @author: kx
     * @date: 2025/5/28 16:01
     * @param orderId : 订单编号
     * @param orderStatus : 订单状态
     * @param cancelReason : 取消原因
     * @description: 根据订单编号修改订单状态
    */
    void updateOrderStatus(String orderId, Integer orderStatus, String cancelReason);

    /**
     * @author: kx
     * @date: 2025/6/4 9:01
     * @param orderId : 订单编号
     * @return com.entity.Order
     * @description: 根据订单编号查询订单信息
    */
    Order getOrderById(String orderId);

    /**
     * @author: kx
     * @date: 2025/6/11 9:11
     * @param yearMonth : 年月份
     * @return java.math.BigDecimal
     * @description: 根据年月份查询该年月份的销售额
    */
    BigDecimal findSalesByYearAndMonth(String yearMonth);

    /**
     * @author: kx
     * @date: 2025/6/11 20:21
     * @param year : 年份
     * @return java.util.Map<java.lang.Integer,java.math.BigDecimal>
     * @description: 根据年份查询该年份下的各月销售额
    */
    Map<Integer, BigDecimal> getMonthlySalesByYear(String year);

    /**
     * @author: kx
     * @date: 2025/6/16 15:39
     * @param pageNum : 页码
     * @param pageSize : 每页显示数量
     * @return com.github.pagehelper.PageInfo<com.entity.Order>
     * @description: 分页查询所有订单信息
    */
    PageInfo<OrderDto> findAllOrders(int pageNum, int pageSize);

    /**
     * @author: kx
     * @date: 2025/6/19 15:36
     * @param userKeyword : 用户名关键字
     * @param pageNum : 页码
     * @param pageSize : 每页显示数量
     * @return com.github.pagehelper.PageInfo<com.dto.OrderDto>
     * @description: 根据用户名关键字分页查询订单信息
    */
    PageInfo<OrderDto> findOrdersByUserId(String userKeyword, int pageNum, int pageSize);
}
